/*
 ***************************************************************************************
 *  Copyright (C) 2006 EsperTech, Inc. All rights reserved.                            *
 *  http://www.espertech.com/esper                                                     *
 *  http://www.espertech.com                                                           *
 *  ---------------------------------------------------------------------------------- *
 *  The software in this package is published under the terms of the GPL license       *
 *  a copy of which has been included with this distribution in the license.txt file.  *
 ***************************************************************************************
 */
package com.espertech.esper.common.internal.collection;

import com.espertech.esper.common.client.EventBean;

import java.util.ArrayDeque;

/**
 * Simple collection that exposes a limited add-and-get interface and that is optimized towards holding
 * a single event, but can hold multiple events. If more then one event is added, the
 * class allocates a linked list for additional events.
 */
public class OneEventCollection {
    private EventBean firstEvent;
    private ArrayDeque<EventBean> additionalEvents;

    /**
     * Add an event to the collection.
     *
     * @param theEvent is the event to add
     */
    public void add(EventBean theEvent) {
        if (theEvent == null) {
            throw new IllegalArgumentException("Null event not allowed");
        }

        if (firstEvent == null) {
            firstEvent = theEvent;
            return;
        }

        if (additionalEvents == null) {
            additionalEvents = new ArrayDeque<EventBean>();
        }
        additionalEvents.add(theEvent);
    }

    /**
     * Returns true if the collection is empty.
     *
     * @return true if empty, false if not
     */
    public boolean isEmpty() {
        return firstEvent == null;
    }

    /**
     * Returns an array holding the collected events.
     *
     * @return event array
     */
    public EventBean[] toArray() {
        if (firstEvent == null) {
            return new EventBean[0];
        }

        if (additionalEvents == null) {
            return new EventBean[]{firstEvent};
        }

        EventBean[] events = new EventBean[1 + additionalEvents.size()];
        events[0] = firstEvent;

        int count = 1;
        for (EventBean theEvent : additionalEvents) {
            events[count] = theEvent;
            count++;
        }

        return events;
    }

    public void add(EventBean[] events) {
        for (EventBean theEvent : events) {
            add(theEvent);
        }
    }

    public EventBean getFirstEvent() {
        return firstEvent;
    }

    public ArrayDeque<EventBean> getAdditionalEvents() {
        return additionalEvents;
    }

    public void clear() {
        firstEvent = null;
        if (additionalEvents != null) {
            additionalEvents.clear();
        }
    }
}
